﻿using Consul;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EWC.Core.Consuls.Register
{
    public class ConsulRegister : IConsulRegister
    {
        private readonly ConsulRegisterOptions _consulRegisterOptions;

        // 注册服务时使用构造函数注入 ConsulRegisterOptions 配置类
        // IOptionsMonitor可用于获取选项库中最新选项的变化.     
        public ConsulRegister(IOptionsMonitor<ConsulRegisterOptions> consulRegisterOptions)
        {
            // 获取配置项的当前值
            _consulRegisterOptions = consulRegisterOptions.CurrentValue;
        }

        public async Task ConsulRegistAsync()
        {
            // 创建 Consul 客户端实例
            var client = new ConsulClient(options =>
            {
                // 设置 Consul 客户端 Adresss 地址
                options.Address = new Uri(_consulRegisterOptions.Address);
            });

            // 创建服务注册的元数据 AgentServiceRegistration 对象
            var registration = new AgentServiceRegistration
            {
                // 服务 ID 唯一性
                ID = Guid.NewGuid().ToString(),
                // 服务名，相对一类服务的名称（例如服务的名称、一类服务的名称等）
                Name = _consulRegisterOptions.Name,
                // 服务绑定的 IP 地址，在微服务场景中使用的是服务的私有 IP 地址
                Address = _consulRegisterOptions.Ip,
                // 服务绑定的端口
                Port = Convert.ToInt32(_consulRegisterOptions.Port),

                Check = new AgentServiceCheck
                {
                    // 注册的服务多久之后需要注销服务，不设置默认为 eternity 代表永不过期
                    DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),
                    // 间隔多长时间进行健康检查，健康检查时间间隔（心跳时间）
                    Interval = TimeSpan.FromSeconds(10),
                    // 健康检查地址
                    HTTP = $"{_consulRegisterOptions.SchemeHttp}://{_consulRegisterOptions.Ip}:{_consulRegisterOptions.Port}{_consulRegisterOptions.HealthCheck}",
                    // 等待多久之后关闭超时时间，健康检查心跳超时时间
                    Timeout = TimeSpan.FromSeconds(5)
                }
            };
            // Consul 进行服务注册
            await client.Agent.ServiceRegister(registration);
        }
    }
}
